package hihocoder;
/**
 * 
 */


import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.Map.Entry;

/**
 * @author zhongfang
 *
 */
public class 智力竞赛 {
	
	/**
	 * 
	 * @param A
	 * @param i 当前遍历元素
	 * @param M 剩下的答题机会
	 * @return 第i题所需答对的次数,-1为不可能答对
	 */
	private static int calculate(int[] A,int i,int M,int S,int T) {
		if(M<0){
			return -1;
		}
		if(i==A.length){
			return 0;
		}
		int otherLimit=A.length-i-1;
		int limit=M-otherLimit;//这道题所有的答题机会,至少给剩下的题目每道题一个答题机会
		int correctLimit=((A[i]/S));//答题正确的所需最大机会次数——靠全部答题正确来通过第i关
		if(A[i]%S!=0){
			correctLimit++;
		}
		if(limit<correctLimit){
			correctLimit=limit;
		}
		int minCorrectCount=Integer.MAX_VALUE;
		for (int j = 0; j <= correctLimit; j++) {//第i道题答对的机会
			int wrongFen=A[i]-j*S;//错误答题需要凑够d分数
			int wrongCount=0;
			if(wrongFen>0){
				wrongCount=(wrongFen)/T;//这道题错误的次数
				if(wrongFen%T!=0)
					wrongCount++;
			}
			if(j+wrongCount>limit){//这个方案不可行
				continue;
			}
			int next=calculate(A,i+1,M-wrongCount-j,S,T);//递归计算下一个,i+1~n-1需要的最小正确次数
			if(next==-1){//这个方案导致后面不可行
				continue;
			}
			if(j+next<minCorrectCount){
				minCorrectCount=j+next;
			}
		}
		return minCorrectCount==Integer.MAX_VALUE?-1:minCorrectCount;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int Q=scanner.nextInt();
		while (Q-->0) {
			int N=scanner.nextInt();
			int M=scanner.nextInt();
			int S=scanner.nextInt();
			int T=scanner.nextInt();
			int A[]=new int[N];
			for (int i = 0; i < N; i++) {
				A[i]=scanner.nextInt();
			}
			int[][] f=new int[N][M];
			int sumWrongLimit=0;
			for (int i = 0; i < N; i++) {
				int wrongLimit=getCeil(A[i],T);//错误的
				sumWrongLimit+=wrongLimit;
				for (int j = 0; j <= sumWrongLimit; j++) {
					int min=Integer.MAX_VALUE;
					for (int x = 0; x <= wrongLimit&&x<=j; x++) {
						int tmp=0;
						//(i==0?getCeil(A[i]-T*x, S):f[i-1][j-x]+getCeil(A[i]-T*x, S));//正确的
						if(i==0){
							tmp=getCeil(A[i]-T*x, S);
						}else {
							tmp=f[i-1][j-x]+getCeil(A[i]-T*x, S);
						}
						if(min>tmp){
							min=tmp;
						}
					}
					f[i][j]=min;
				}
			}
			int min=Integer.MAX_VALUE;
			for (int i = 0; i < M; i++) {
				if(f[N-1][i]!=0&&min>f[N-1][i]){
					min=f[N-1][i];
				}
			}
			System.out.println(min);
		}
	}

	private static int getCeil(int i, int t) {
		int result=i/t;
		if(i%t!=0){
			result++;
		}
		return result;
	}

}
